package net.schastny.shopmanager.web;

import java.util.Map;

import net.schastny.shopmanager.domain.BaseOrder;
import net.schastny.shopmanager.domain.Order;
import net.schastny.shopmanager.domain.PreOrder;
import net.schastny.shopmanager.service.BaseOrderService;
import net.schastny.shopmanager.service.OrderService;
import net.schastny.shopmanager.service.PreOrderService;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class OrderController {
	protected static Logger logger = Logger.getLogger("controller");
	
	@Autowired
    private BaseOrderService baseorderService;
	@Autowired
    private PreOrderService preorderService;
	@Autowired
    private OrderService orderService;

	
	/*RequestMapping - Аннотация используется для маппинга урл-адреса запроса на указанный метод или класс. 
	 * Запрос можно маппить как на метод класса, так и на целый класс.
	 *  Допускается указывать конкретный HTTP-метод, который будет обрабатываться (GET/POST), 
	 *  передавать параметры запроса.
	 */
	@RequestMapping("/newOrder")
    public String listOrder(Map<String, Object> map) {

        map.put("baseOrder", new BaseOrder());
        map.put("baseOrderList", baseorderService.listBaseOrder());
        
        map.put("preorder", new PreOrder());
        map.put("preorderList", preorderService.listPreOrder());
        
        return "baseorderadd";
    }
	
/*	@RequestMapping("/")
    public String home() {
        return "redirect:/shop";
    }
*/
	/*ModelAttribute - Аннотация, связывающая параметр метода или возвращаемое значение метода с атрибутом модели,
	 *  которая будет использоваться при выводе jsp-страницы.
	 */
	@RequestMapping(value = "/addOrder", method = RequestMethod.POST)
    public String addBaseOrder(@ModelAttribute("baseOrder") BaseOrder baseOrder,
            BindingResult result) {

        baseorderService.addBaseOrder(baseOrder);

        return "redirect:/order";
    }
	/*PathVariable - Аннотация, которая показывает, что параметр метода должен быть связан с переменной из урл-адреса. 
	 */
	@RequestMapping("/deleteOrder/{baseOrderId}")
    public String deleteBaseOrder(@PathVariable("baseOrderId") Integer baseOrderId) {

        baseorderService.removeBaseOrder(baseOrderId);

        return "redirect:/order";
    }	
	
    /**
     * Retrieves the "Edit Existing Record" page
     */
    @RequestMapping(value = "/editOrder", method = RequestMethod.GET)
    public String getEdit(@RequestParam("id") Integer baseOrderId, Model model) {
    	logger.debug("Received request to show edit page");
    	
    	//get existing BaseOrder
    	BaseOrder existingBaseOrder = baseorderService.getBaseOrder(baseOrderId);
    	// Add existing BaseOrder to model
    	model.addAttribute("baseOrderAttribute", existingBaseOrder);
    	
    	//get Orders List associated with existing BaseOrder
    	//model.addAttribute("order", new Order());   
    System.out.println("**************** Size = "+ orderService.getAll(baseOrderId).size());
    	model.addAttribute("orderList", orderService.getAll(baseOrderId));   	

    	//get PreOrders List
    	model.addAttribute("preorder", new PreOrder());   	
    	model.addAttribute("preorderList", preorderService.listPreOrder());   	
    	
    	// This will resolve to /WEB-INF/jsp/edit-record.jsp
    	return "order";
	}
 
    /**
     * Edits an existing record
     */
    @RequestMapping(value = "/editOrder", method = RequestMethod.POST)
    public String postEdit(@RequestParam("id") Integer baseOrderId, 
    						    @ModelAttribute("baseOrderAttribute") BaseOrder baseorder) {
		logger.debug("Received request to edit existing base order");
		
		// Assign id
		baseorder.setBaseorderId(baseOrderId);
		
		// Delegate to service
		baseorderService.editBaseOrder(baseorder);

		// Redirect to url
		return "redirect:/order";
	}
    
    /**
     * Edits an existing record
     */
    @RequestMapping(value = "/addPreOrderToOrder", method = RequestMethod.GET)
    public String addPreOrder(@RequestParam("pid") Integer baseOrderId, 
    								@RequestParam("preOrderId") Integer preOrderId) {
		logger.debug("Received request to edit existing base order");
	 	PreOrder preorder = preorderService.getPreOrder(preOrderId);	
	 	
		Order order = new Order();
		System.out.println("////////////////////preorder = "+preorder.toString());
		
		orderService.addOrder(baseOrderId,order);
		
		// Redirect to url
		return "redirect:/order";
	}   

}
